package com.base.common.action;

import com.cjy.common.service.CRUDService;
import com.base.common.bean.ActionResult;
import com.base.common.utils.StringUtils;

import static com.base.common.GlobaConstants.OK;

/**
 * 本Action帮助自动实现CRUD。 使用说明： 1.service需要继承CRUDService 2.Action继承此基类即可
 * 3.目前所有返回都是JSON格式数据,如果要自定义result,可以在自己的action中定义@Result
 * 5.在prepared方法中，需要注入crudService与model; 2013-12-3 下午4:17:40
 * 
 * @author jay.zhoujingjie
 */

public abstract class AbstractCRUDAction<T> extends AbstractBaseAction {

	private static final long serialVersionUID = 1L;

	// model
	private T model;
	// CRUDService接口，具体实现service需实现此接口
	private CRUDService<T> crudService;

	/**
	 * 将实体类注入model 子类使用范例： protected void prepare() {
	 * this.bindProperties(userService,user) }
	 * 
	 * @author hubery.niejinzhen void
	 */
	protected abstract void prepare();

	/**
	 * 将model放入实体类 子类使用范例： protected void finish(User model) { this.user =
	 * model; }
	 * 
	 * @param model
	 *            void
	 * @author hubery.niejinzhen
	 */
	protected abstract void finish(T model);

	/**
	 * 绑定属性
	 * 
	 * @param crudService
	 * @param model
	 *            void
	 * @author jay.zhoujingjie
	 */
	protected void bindProperties(CRUDService<T> crudService, T model) {
		this.crudService = crudService;
		this.model = model;
	}

	/**
	 * 创建方法
	 * 
	 * @return String
	 * @author hubery.niejinzhen
	 */
	public String create() {
		prepare();
		actionResult = ActionResult
				.getActionResult(crudService.create(model) > 0 ? OK : ERROR);
		return returnType();
	}

	/**
	 * 删除方法
	 * 
	 * @return String
	 * @author hubery.niejinzhen
	 */
	public String delete() {
		actionResult = ActionResult
				.getActionResult(crudService.delete(uuid) > 0 ? OK : ERROR);
		return returnType();
	}

	/**
	 * 修改方法
	 * 
	 * @return String
	 * @author hubery.niejinzhen
	 */
	public String update() {
		prepare();
		actionResult = ActionResult
				.getActionResult(crudService.update(model) > 0 ? OK : ERROR);
		return returnType();
	}

	/**
	 * 查询方法
	 * 
	 * @return String
	 * @author hubery.niejinzhen
	 */
	public String read() {
		prepare();
		model = crudService.read(uuid);
		finish(model);
		actionResult = ActionResult.getActionResult(model);
		return returnType();
	}

	/**
	 * 增加或者修改:uuid为null为增加,uuid不为null为修改
	 * 
	 * @return String
	 * @author jay.zhoujingjie
	 */
	public String saveOrUpdate() {
		if (StringUtils.isEmptyByTrim(uuid) || "0".equals(uuid) //
				|| "add".equals(uuid) || "create".equals(uuid)) {
			return create();
		} else {
			return update();
		}
	}

	public T getModel() {
		return model;
	}

	public void setModel(T model) {
		this.model = model;
	}

}
